/**
 * 9.回文数
 * 题意：判断一个整数是否是回文数。回文数是指正序（从左向右）和倒序（从右向左）读都是一样的整数。
 *
 * 难度：简单
 * 分类：数组 字符串
 * 算法：
 *
 * 临界条件：负数不可能是回文，除了0以外，个位数为0的数不可能是回文
 * 法一：字符串，翻转所有字符串，按字符数组经典方法操作 时间O(n) 空间(n)
 * 法二：数学法，反转一半数字  时间O(log10n) 空间(n)
 * 当数字大于反转后的数字，每次迭代数字初于十，反转数字数组 *10加迭代数字%10；
 * 针对奇数偶数进行校验 return num==reverseNum(偶数情况) num==reverseNum/10(奇数情况)
 */
public class lc9回文数 {
    public static void main(String[] args) {
        int num = 1234321;
//        System.out.printf("%d是否为回文串:"+isPalindromeByString(num),num);
        System.out.printf("%d是否为回文串:"+isPalindromeByMath(num),num);


    }


    /**
     * 数学法
     *
     * @param num
     * @return
     */
    public static boolean isPalindromeByMath(int num) {
        if (num < 0 || (num % 10 == 0 && num != 0)) {
            return false;
        }
        int reverseNum = 0;
        while(num>reverseNum){
            reverseNum = reverseNum*10+num%10;
            num/=10;
        }
        return (num==reverseNum)||(num==reverseNum/10);

    }

    /**
     * 数字转化为字符串法
     * 时间复杂度:O(n) 空间复杂度O(n)
     * @param num
     * @return
     */
    public static boolean isPalindromeByString(int num){
        if(num<0){
            return false;
        }
//        String str = String.valueOf(num);
//        char[] chars = str.toCharArray();
        //少声明一个引用变量 运行速度快了1ms
        char[] chars = String.valueOf(num).toCharArray();
        int length = chars.length;
        for(int i=0;i<length/2;i++){
            if(chars[i]!=chars[length-1-i]){
                return false;
            }
        }
        return true;
    }


}
